import useStore  from '..';
import { defineStore } from "pinia";
import request from '@/utils/request'
import { ApiRes } from '@/types/data'
import { CartItem } from '@/types/cart'
const useCartStore = defineStore('cart', {
  // 状态
  state() {
    return {
      list: [] as CartItem[] ,// 购物车数组
     
    }
  },
  // 开启了持久化存储, 监听该模块数据的变化, 实现自动存储
  // persist: true,
  persist: {
    key: 'rabbit-cart-96'
  },  
  // 计算
  getters: {
    // 判断是否登录
    isLogin(): boolean {
      const { user } = useStore()
      // 如果token存在, 返回的就是true , 反之就是false
      // token: asada12312  true
      // token: ''          false
      return !!user.profile.token
    },
    // 计算有效的商品列表
    effectiveList(): CartItem[] {
      // 有效: 商品库存 > 0 && 商品是有效的 isEffective(是否有效)
      return this.list.filter(item => item.stock > 0 && item.isEffective)
    },
    // 计算有效商品总数量 reduce => 每一项商品的数量 - count 
    effectiveListCounts(): number {
      return this.effectiveList.reduce((sum, item) => sum + item.count  ,0)
    },
    // 计算有效商品总价
    effectiveListPrice(): string {
      return this.effectiveList
              .reduce((sum, item) => sum + item.count  * +item.nowPrice ,  0)
              .toFixed(2)
    },
    // 获取全选框的状态
    isAllSelected(): boolean {
      return this.effectiveList.length !== 0 &&  this.effectiveList.every(item => item.selected)
    },
    // 已选择的列表
    selectedList(): CartItem[] {
      return this.effectiveList.filter(item => item.selected)
    },
    // 已选择的商品总数 
    selectedListCounts(): number {
      return this.selectedList.reduce((sum, item) => sum + item.count, 0)
    },
    // 已选择的商品总价
    selectedListPrice(): string{
      return this.selectedList
              .reduce((sum, item) => sum + item.count * +item.nowPrice, 0)
              .toFixed(2)
    }
  },
  // 方法
  actions: {
    // 加入购物车
    async addCart(data: CartItem) {
      if (this.isLogin) {
        // 针对的是已登录的用户, skuId 和 count 
        const { skuId, count } = data
        await request.post('/member/cart', {
          skuId,
          count
        })
        // 重新的获取购物车的列表数据 - 即时刷新
        this.getCartList()
      } else {
        // console.log('未登录, 加入本地购物车');
        // 1. 判断购物车列表是否存在该商品 skuId 
        const goods = this.list.find(item => item.skuId === data.skuId)
        if (goods) {
          // 1.1 如果存在, 修改该商品的数量
          goods.count += data.count  
        }else {
          // 1.2 如果不存在. 直接把商品添加进来
          this.list.unshift(data)
        }
      }
    },
    // 购物车列表 
    async getCartList() {
      // 根据isLogin进行判断
      // isLogin true -> 登录
      // isLogin false -> 未登录
      if (this.isLogin) {
        const res = await request.get<ApiRes<CartItem[]>>('/member/cart')
        // console.log('购物车列表', res.data.result);
        this.list = res.data.result
      } else {
        console.log('未登录, 获取本地购物车列表');
        // 问题: 本地的数据可能和线上的不同步 -> 错误显示
        // 解决：发送请求 - 获取最新的商品的一些信息， 价格， 库存， 是否有效
        // 1. 遍历发送请求 -》 获取最新的信息
        this.list.forEach(async(cartItem ) => {
          const { skuId } = cartItem
          console.log(skuId);
          // 2. 根据skuId 获取最新的商品信息
          const res = await request.get<ApiRes<CartItem>>(`/goods/stock/${skuId}`)
          console.log(res.data.result);
          // 商品的最新信息
          const lastInfo = res.data.result
          // console.log(lastInfo);
          // 更新商品现价
          cartItem.nowPrice = lastInfo.nowPrice
          // 更新商品库存
          cartItem.stock = lastInfo.stock
          // 更新商品是否有效
          cartItem.isEffective = lastInfo.isEffective
          
        })
      }
    },
    // 删除购物车
    async deleteCart(skuIds: string[]) {
      if (this.isLogin) {
        await request.delete('/member/cart', {
          data: {
            ids: skuIds
          }
        }) 
        // 重新的获取购物车的列表数据 - 即时刷新
        this.getCartList()
      } else {
        // 未登录
        console.log('未登录的删除操作');
        // skuIds[0] 删除的这项的skuId  
        // 方式1： 
        // this.list = this.list.filter(item => item.skuId  !== skuIds[0])
        // 方式2：includes 包含
        // skuIds 数组中 -> 只要存在, 就删除
        this.list = this.list.filter(item => !skuIds.includes(item.skuId))

        
      }
    },
    // 修改/更新购物车的商品状态 - 商品的数量 , 商品的选中状态
    async updateCart(skuId: string, data: {selected?: boolean, count?: number}) {
      if (this.isLogin) {
        await request.put(`/member/cart/${skuId}`, data)
        // 重新获取购物车的列表
        this.getCartList()
      } else {
        // 1. 需要找到正在操作的商品 -> 商品信息 -> 数量, 选中状态
        const goods = this.effectiveList.find(item => item.skuId === skuId)

        // 传过来的商品数量 , 存在, 直接赋值的操作
        if (data.count) {
          goods!.count = data.count
        }
        // 修改传过来的商品状态
        // false / true -> 进入到判断中
        if (data.selected !== undefined ) {
          goods!.selected = data.selected
        }
      }
    },
    // 全选和取消全选
    async updateCartAllSelected(isSelected: boolean) {
      if (this.isLogin) {
        await request.put('/member/cart/selected', {
          selected: isSelected
        })
        // 获取购物车的列表
        this.getCartList()
      } else {
        this.list.forEach(item => item.selected = isSelected)
      }
    },
    // 清空购物车
    clearCart() {
      // 退出时, 直接清空
      this.list = []
    },
    // 合并购物车
    async mergeCart() {
      console.log(this.list);
      const data = this.list.map(({ skuId, selected, count}) => {
        return {
          skuId, selected, count
        }
      })
      await request.post('/member/cart/merge', data)
      // 合并成功, 重新获取购物车列表
      this.getCartList()
    }
  },
});

export default useCartStore;